從最早期的MySQL Extension,到後來的 MySQLi Extension,再來是更進階的 PDO ,從以前每一個連線都需要自己寫,要防範外部傳進來的資料造成 SQL Injection,每個時期的進步也都解決了前一個時期的問題,現今的框架已經把這些問題都解決了。
Laravel 的 Model 層負責處理 AP 層與資料庫之間的溝通,並且將關聯、特殊處理、隱藏特殊資料等功能都已經寫好,只需要設定即可使用,搭配 Migration 的功能可以將資料庫的 Table、Column 設定文件化,更容易了解整個專案的來龍去脈,以下就以實例的方式來講解幾個常見關聯及 Model、Migration 的使用方式。
假設這次有三個實體,使用者(User)紀錄姓名、性別,評論(Post)紀錄撰寫者、標題、內容、最佳留言,留言(Comment)紀錄留言在哪篇文章、留言者、內容,先將這三個實體利用指令建立起來。
php artisan make:model User -m
php artisan make:model Post -m
php artisan make:model Comment -m
-m 參數代表連同 migration 一起創建
User migration
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->integer('gender');
$table->timestamps();
});
}
Post migration
public function up()
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->unsignedInteger('writer_id');
$table->foreign('writer_id')
->references('id')
->on('users')
->onUpdate('CASCADE')
->onDelete('CASCADE');
$table->string('title');
$table->text('content');
$table->unsignedInteger('best_comment_id')->nullable();
$table->foreign('best_comment_id')
->references('id')
->on('comments')
->onUpdate('CASCADE')
->onDelete('CASCADE');
$table->timestamps();
});
}
Comment migration
public function up()
{
Schema::create('comments', function (Blueprint $table) {
$table->id();
$table->unsignedInteger('post_id');
$table->foreign('post_id')
->references('id')
->on('posts')
->onUpdate('CASCADE')
->onDelete('CASCADE');
$table->unsignedInteger('user_id');
$table->foreign('user_id')
->references('id')
->on('users')
->onUpdate('CASCADE')
->onDelete('CASCADE');
$table->timestamps();
});
}
migration 寫好之後即可下指令建立 Tablephp artisan migrate
這時候就要開始解釋三者之間的關係
一個使用者可以發佈多篇評論,所以使用者與評論的關係屬於一對多,此時到 User 的 Model 設定關聯
public function posts()
{
return $this->hasMany(Post::class, 'writer_id');
}
一篇評論會有多個留言,所以評論與留言的關係是一對多,但是一篇評論只會有一個最佳留言,所以最佳留言與評論的關係是一對一
public function comments()
{
return $this->hasMany(Comment::class, 'post_id');
}
public function bestComment()
{
return $this->hasOne(Comment::class);
}
今天先介紹這幾個常用關聯就好,明天再來繼續介紹其他在 Model 裡好用的參數。